package com.binance.autojob.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
import com.xxl.job.core.glue.GlueTypeEnum;

/**
 * 用于注释自动被注册到执行器的方法和类</br>
 * 1、注解一个方法，可以指定任务名，默认是方法的全路径名。 </br>
 * 2、注解一个bean，类中的public方法(方法上需无此注释)都自动注册到执行器，此时制定的名称是类中全部方法的前缀 </br>
 * 3、有4个非空项必填，如果任何一个不填，则不会自动注册任务到调度中心。此时需要手动注册调度中心</br>
 *     author 负责人;</br>
 *     executorName 执行器</br>
 *     appName;cron 定时表达式;</br>
 *     alarmEmail 报警邮件</br>
 *   
 * 4、所有属性都支持占位符 ${...}
 * 
 * @author zhangwenhui
 *
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyScheduledJob {

    /**
     * jobHandle的名称，用于XXL管理页面的任务注册，默认是[前缀(如果注解在类上)_]方法的全名
     * 
     * @return
     */
    @AliasFor("jobHandler")
    String value() default "";

    /**
     * 注解在类上，这个字段是任务名的前缀，任务名：“前缀_方法全名” </br>
     * 注解在方法上，这个字段就是任务名，默认是方法全名
     * 
     * @return
     */
    @AliasFor("value")
    String jobHandler() default "";

    /**
     * 任务描述，默认是jobHandler的值
     * 
     * @return
     */
    String jobDesc() default "";

    /**
     * 负责人，默认 ${xxl.job.task.author}
     * 
     * @return
     */
    String author() default "";

    /**
     * 报警邮件，默认 ${xxl.job.task.email}
     * 
     * @return
     */
    String alarmEmail() default "";

    /**
     * 执行器路由策略 </br>
     * 见schedule-admin的com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum类 </br>
     * 
     * "FIRST" 第一个</br>
     * "LAST" 最后一个</br>
     * "ROUND" 轮询</br>
     * "RANDOM" 随机</br>
     * "CONSISTENT_HASH" 一致性HASH</br>
     * "LEAST_FREQUENTLY_USED" 最不经常使用</br>
     * "LEAST_RECENTLY_USED" 最近最久未使用</br>
     * "FAILOVER" 故障转移</br>
     * "BUSYOVER" 忙碌转移</br>
     * "SHARDING_BROADCAST" 分片广播
     * 
     */
    String routeStrategy() default "FIRST";

    /**
     * 任务参数
     * 
     * @return
     */
    String param() default "";


    /**
     * 任务cron表达式
     * 
     * @return
     */
    String cron() default "";

    /**
     * 阻塞处理策略
     * 
     * @return
     */
    ExecutorBlockStrategyEnum blockStrategy() default ExecutorBlockStrategyEnum.SERIAL_EXECUTION;

    /**
     * 失败处理策略</br>
     * 
     * "FAIL_ALARM" 失败告警
     * "FAIL_RETRY" 失败重试
     * 
     * 
     * @return
     */
    String failStrategy() default "FAIL_RETRY";

    /**
     * 任务类型
     * 
     * @return
     */
    GlueTypeEnum glueType() default GlueTypeEnum.BEAN;


    /**
     * 非Bean类型的脚本任务时，此处保存待执行的脚本
     * 
     * @return
     */
    String glueSource() default "";

    /**
     * 子任务ID，多个逗号分隔
     * 
     * @return
     */
    String childJobId() default "";


    /**
     * 任务管理的执行器，默认${xxl.job.executor.appname}
     * 
     * @return
     */
    String executorName() default "";

}
